package com.example.joke.proxy.star

import android.util.Log
import java.lang.reflect.Proxy

object ProxyUtil {
    /**
     * 方法的作用：给一个大明星的对象，创建一个代理
     * 形参：被代理的大明星对象
     * 返回值：给明星创建的代理
     *
     * 需求：粉丝想要大明星唱一首歌
     * 1. 获取代理的对象，代理对象 = ProxyUtil.createProxy(大明星对象)
     * 2. 再调用代理的唱歌方法，代理对象.唱歌的方法("歌曲名字")
     */
    fun createProxy(bigStar: BigStar) : IStar {
        /**
         * java.lang.reflect.Proxy类：提供了为对象产生代理对象的方法
         * 参数一：用于指定用哪个类加载器，去加载生成的代理类
         * 参数二：指定接口，这些接口用于指定生成的代理长什么样子，也就是有哪些方法
         * 参数三：用来指定生成的代理对象要干什么事情
         */
        val iStar = Proxy.newProxyInstance(
            bigStar.javaClass.classLoader,
            bigStar.javaClass.interfaces
        ) { proxy, method, args ->
            /**
             * 参数一：代理的对象，一般不用这个参数
             * 参数二：要运行的方法，eg：sing
             * 参数三：调用方法时，传递的实参，eg：调用sing方法时，会传递一个歌曲名字字符串
             */
            if ("sing" == method.name) {
                Log.d("", "准备话筒，收演唱会门票")
            } else if ("dance" == method.name) {
                Log.d("", "准备场地，收观看门票")
            }
            // 去找大明星开始唱歌或者跳舞
            // 代码的表现形式：调用大明星里面唱歌或者跳舞的方法
            method.invoke(bigStar, *args.orEmpty())
        } as IStar
        return iStar
    }
}